An interactive construction of a rational transfer function from its pole and zero pattern. The first section establishes the correspondence between pole and zero positions and the magnitude response. The second builds $|H(j\omega)|$ from first principles as a product of vector lengths drawn from each zero and pole to the test point, and extends the construction to $|H(s)|$ as a surface over the complex plane. The third decomposes the phase response into the angles those same vectors subtend with the positive real direction. The fourth derives the $-3$ dB definition of the cutoff frequency from the geometry of a first-order low-pass. The fifth takes the high-frequency limit of the same expression, deriving the $-20$ dB/decade asymptotic slope and identifying the corner frequency as the intersection of the passband and rolloff asymptotes.
A rational transfer function is determined to within a scalar gain $K$ by the locations of its zeros $\{z_i\}$ and its poles $\{p_j\}$ in the complex plane:
Poles and zeros are added by clicking inside the $s$-plane in the mode selected above the plot, repositioned by dragging, and removed by right-clicking. The factored and expanded forms of $H(s)$ and the Bode magnitude response are recomputed from the current pole–zero set after every modification.
A pole situated close to the $j\omega$ axis produces a local maximum of $|H(j\omega)|$ at the frequency directly opposite it, because the denominator factor $|j\omega - p_j|$ attains a local minimum at that point. A zero close to the axis produces a local minimum of $|H(j\omega)|$ by the same argument applied to the numerator. A pole in the right-half plane (shaded red) places the corresponding time-domain mode in exponential growth and the system is unstable; the frequency response remains well-defined as an algebraic expression but no longer describes the steady-state response to a sinusoidal input.
Each factor $(j\omega - z_i)$ in the numerator and $(j\omega - p_j)$ in the denominator is a complex number, and any complex number $w$ can be drawn as a vector with length $|w|$ and angle $\arg(w)$. Read this way, $(j\omega - p_j)$ is the vector from the pole $p_j$ to the test point $j\omega$ on the imaginary axis, and likewise for each zero. The magnitude rule for products and quotients of complex numbers, $|ab| = |a||b|$ and $|a/b| = |a|/|b|$, then reads the response off directly:
The magnitude at any frequency is therefore the product of the zero-vector lengths divided by the product of the pole-vector lengths, scaled by the gain. The probe slider moves the test point up the $j\omega$ axis; the diagram on the right redraws each vector and writes its length along it. The shortest pole and shortest zero vectors are highlighted because they dominate the local behaviour of $|H|$.
When $\omega$ approaches the imaginary part of a pole, the corresponding pole-vector becomes short. Its reciprocal in the denominator is large, so $|H(j\omega)|$ peaks. Pushing the probe past the pole's imaginary part lengthens the vector again, so the peak is local to that frequency.
A zero close to the axis produces a short zero-vector when the probe is near it; the numerator drops, so $|H(j\omega)|$ falls into a notch.
When the probe is far from all singularities, every vector length grows roughly like $\omega$. The ratio of the products tends to a fixed power of $\omega$ set by the difference between the number of zeros and the number of poles, giving the high-frequency asymptote of the Bode magnitude.
The same construction extended off the $j\omega$ axis defines $|H(s)|$ as a surface over the entire complex plane. Poles are points at which the surface diverges, zeros are points at which it vanishes, and the Bode magnitude curve is the cross-section of this surface along the $j\omega$ axis. Toggle the 3D view below to inspect the surface directly.
Using the same vectors from the previous section, the argument rule for products and quotients, $\arg(ab) = \arg(a) + \arg(b)$ and $\arg(a/b) = \arg(a) - \arg(b)$, gives the phase decomposition
Moving the probe along the $j\omega$ axis rotates each vector and changes the angle it subtends with the positive real direction. The diagram on the right marks the angle of each vector with an arc and a signed value, in zero or pole colour. The Bode phase at the probe frequency equals the sum of zero angles minus the sum of pole angles modulo $360°$.
A first-order low-pass filter has a single pole at $s = -\omega_c$ on the negative real axis and no finite zeros:
Evaluated on the $j\omega$ axis, the magnitude is the constant $\omega_c$ divided by the length of the vector from the pole at $-\omega_c$ to the evaluation point $j\omega$:
At $\omega = 0$ the pole-vector is horizontal with length $\omega_c$, so $|H(0)| = 1$ (the 0 dB passband). As $\omega$ increases the vector lengthens monotonically and the magnitude decreases.
When $\omega = \omega_c$ the triangle formed by the pole, the origin, and the evaluation point $j\omega$ is right-isosceles: both legs have length $\omega_c$ and the hypotenuse, equal to the pole-vector length, is therefore $\sqrt{2}\,\omega_c$.
In decibels,
The $-3$ dB definition of the cutoff frequency is therefore an algebraic consequence of the squared pole-vector length doubling between $\omega = 0$ and $\omega = \omega_c$. Because $|H|^{\,2}$ is proportional to transmitted power, the same frequency is equivalently termed the half-power point: $|H(j\omega_c)|^{\,2} = 1/2$.
The pole-vector length expression from the previous section fixes the magnitude of a first-order low-pass at every frequency. Taking the high-frequency limit of that expression shows that, far above $\omega_c$, the Bode plot settles onto a straight line whose slope is exactly $-20$ dB per decade.
For $\omega \gg \omega_c$ the term $\omega_c^{\,2}$ under the square root is negligible, so $\sqrt{\omega_c^{\,2} + \omega^{\,2}} \approx \omega$ and the magnitude collapses to the ratio of the two vertical distances,
Geometrically this is the pole-vector from $-\omega_c$ to $j\omega$ becoming dominated by its imaginary leg: once $\omega$ is several times $\omega_c$, the small horizontal offset is negligible and the vector length is essentially $\omega$ itself.
Taking $20\log_{10}$ of both sides converts the ratio into a difference:
On a log-frequency axis this is an affine function of $\log_{10}\omega$ with slope $-20$. Multiplying $\omega$ by ten (one decade) subtracts $20$ dB; multiplying $\omega$ by two (one octave) subtracts $20\log_{10}2 \approx 6.02$ dB. The two conventions, $-20$ dB/decade and $-6$ dB/octave, describe the same line.
The low-frequency asymptote is $|H| = 1$, i.e. $0$ dB. The high-frequency asymptote is $|H| = \omega_c/\omega$. Setting them equal gives $\omega = \omega_c$: the two straight-line segments meet at the same frequency identified in the previous section as the $-3$ dB point. The true magnitude passes $3$ dB below that intersection, since at $\omega = \omega_c$ the exact value is $1/\sqrt{2}$ rather than $1$.
Cascading $n$ identical first-order poles multiplies the magnitudes, so $|H(j\omega)| \propto \omega^{-n}$ at high frequency and the asymptotic slope becomes $-20n$ dB/decade. This is the content of the Bode rule in its simplest form: each real pole contributes $-20$ dB/decade above its break frequency, each real zero contributes $+20$ dB/decade, and the total slope at any $\omega$ is the algebraic sum.